#include <iostream>
using namespace std;

#define OK 1
#define ERROR 0
#define OVERFLOW -2

/*程序中相关数据类型定义*/
typedef int Status; //Status 是函数返回值类型，其值是函数结果状态代码。

//（2）用户信息类型及单链表类型定义，复制以下代码到文件并进行补充。
typedef struct  {
    string num;
    string name;
    string major;
    string password;
    //补充代码，完成用户信息字段的定义，其中字符串类型string

} student;  //定义用户信息类型student

typedef struct LNode {
    student data;  //用户信息字段
    struct LNode *next; //指向下一个结点的指针
    //补充代码，完成用户信息字段的定义，其中字符串类型string

} LNode;  //定义用户信息类型student

typedef LNode* LinkList;  //单链表类型定义
typedef student ElemType;  //补充代码，定义单链表中的数据元素类型ElemType为student

//（3）补充代码完成单链表的初始化。
Status InitList_L(LinkList& L) //初始化空链表 
{
    L = new LNode;
    L->next = nullptr;
    return OK;
}

// （4）补充代码完成单链表的查找操作，根据学号进行顺序查找，查找成功返回结点指针，不成功返回NULL。复制并补充代码。
LNode* LocateElem_P(LinkList L, string stu_num) { //修改按照学号查找，返回结点指针 
    LNode* p = L->next;
    while (p != nullptr && p->data.num != stu_num) {
        p = p->next;
    }
    return p;
} //LocateElem_P

// （5）补充代码完成单链表的查找操作，根据学号进行顺序查找，查找成功返回位序，不成功返回0。复制并补充代码。
int LocateElem(LinkList L, string stu_num) { //修改按照学号查找，返回位序 
    LNode* p = L->next;
    int j = 1;
    while (p != nullptr && p->data.num != stu_num) {
        p = p->next;
        j++;
    }
    if (p == nullptr) return 0;
    else return j;
} //LocateElem

// （6）按行显示用户信息，复制以下代码到程序并补充代码实现该功能。
void PrintList(LinkList L) //按行输出用户的学号、姓名、专业
{
    LNode* p = L->next;
    while (p != nullptr) {
        cout << "学号: " << p->data.num << ", 姓名: " << p->data.name << ", 专业: " << p->data.major << endl;
        p = p->next;
    }
}

// （7）复制单链表的插入操作、删除操作代码。
Status ListInsert_L(LinkList& L, int i, ElemType e) { //算法2.9 单链表的插入
    //在带头结点的单链表L中第i个位置插入值为e的新结点
    LNode* p = L;
    int j = 0;
    while (p && j < (i - 1)) {
        p = p->next;
        j++;
    }
    if (!p || j > i - 1) return ERROR;
    LNode* s = new LNode;
    s->data = e;
    s->next = p->next;
    p->next = s;
    return OK;
} //ListInsert_L

Status ListDelete_L(LinkList& L, int i) { //算法2.10 单链表的删除	
    LNode* p = L;
    int j = 0;
    while (p && j < (i - 1)) {
        p = p->next;
        j++;
    }
    if (!p || j > i - 1 || !(p->next)) return ERROR;
    LNode* q = p->next;
    p->next = q->next;
    delete q;
    return OK;
} //ListDelete_L
